package com.wxdc.nmgyt.nmgytwydc.greendao.ope;

import android.content.Context;
import android.util.Log;

import com.wxdc.nmgyt.nmgytwydc.greendao.CbYfInfoBeanDao;
import com.wxdc.nmgyt.nmgytwydc.greendao.CbYfWzInfoBeanDao;
import com.wxdc.nmgyt.nmgytwydc.greendao.manager.DbManager;
import com.wxdc.nmgyt.nmgytwydc.model.CbYfInfoBean;
import com.wxdc.nmgyt.nmgytwydc.model.CbYfWzInfoBean;

import org.greenrobot.greendao.query.QueryBuilder;

import java.util.List;

/**
 * Created by Administrator on 2018/7/19.
 */

public class CbYfInfoBeanDaoOpe {
    //===================================insert======================================================

    /**
     * 添加数据至数据库
     *
     * @param context
     * @param bean
     */
    public static void insertData(Context context, CbYfInfoBean bean) {
        DbManager.getDaoSession(context).getCbYfInfoBeanDao().insert(bean);
        int len = bean.getGRASS_WZ().size();
        for (int i = 0; i < len; i++) {
            CbYfWzInfoBean wzInfoBean = bean.getGRASS_WZ().get(i);
            wzInfoBean.setCbyfInfoId(bean.getId());
            DbManager.getDaoSession(context).getCbYfWzInfoBeanDao().insert(wzInfoBean);
        }
    }

    /**
     * 添加数据至数据库，如果存在，将原来的数据覆盖
     * 内部代码判断了如果存在就update(entity);不存在就insert(entity)；
     * (save 类似于insertOrReplace，区别在于save会判断传入对象的key，有key的对象执行更新，无key的执行插入。当对象有key但并不在数据库时会执行失败.适用于保存本地列表)
     *
     * @param context
     * @param bean    结论
     *                在确保插入数据有key时必须存在于数据库的情况下，适用save更高效。其他情况一律适用insertOrReplace
     */
    public static void saveData(Context context, CbYfInfoBean bean) {
        DbManager.getDaoSession(context).getCbYfInfoBeanDao().save(bean);
        int len =  bean.getGRASS_WZ().size();
        Log.i("TAG", "saveData: -------------->" + len + "=---------->" + bean.toString());
        for (int i = 0; i < len; i++) {
            CbYfWzInfoBean wzInfoBean = bean.getGRASS_WZ().get(i);
            wzInfoBean.setCbyfInfoId(bean.getId());
            DbManager.getDaoSession(context).getCbYfWzInfoBeanDao().save(wzInfoBean);
        }
    }

    /**
     * 传入的对象在数据库中，有则更新无则插入。推荐同步数据库时使用该方法
     *
     * @param context
     * @param bean
     */
    public static void insertOrReplace(Context context, CbYfInfoBean bean) {
        DbManager.getDaoSession(context).getCbYfInfoBeanDao().insertOrReplace(bean);
        int len =  bean.getGRASS_WZ().size();
        for (int i = 0; i < len; i++) {
            CbYfWzInfoBean wzInfoBean = bean.getGRASS_WZ().get(i);
            wzInfoBean.setCbyfInfoId(bean.getId());
            DbManager.getDaoSession(context).getCbYfWzInfoBeanDao().insertOrReplace(wzInfoBean);
        }
    }
    //========================================delete=================================================

    /**
     * 删除数据至数据库
     *
     * @param context
     * @param bean    删除具体内容
     */
    public static void deleteData(Context context, CbYfInfoBean bean) {
        DbManager.getDaoSession(context).getCbYfInfoBeanDao().delete(bean);
        int len =  bean.getGRASS_WZ().size();
        for (int i = 0; i < len; i++) {
            CbYfWzInfoBean wzInfoBean = bean.getGRASS_WZ().get(i);
            wzInfoBean.setCbyfInfoId(bean.getId());
            DbManager.getDaoSession(context).getCbYfWzInfoBeanDao().delete(wzInfoBean);
        }
    }


    /**
     * 根据实体删除
     *
     * @param context
     * @param entitys
     */
    public static void deleteInTx(Context context, List<CbYfInfoBean> entitys) {
        DbManager.getDaoSession(context).getCbYfInfoBeanDao().deleteInTx(entitys);
        int len = entitys.size();
        for (int i = 0; i < len; i++) {
            DbManager.getDaoSession(context).getCbYfWzInfoBeanDao().deleteInTx(entitys.get(i).getGRASS_WZ());
        }

    }

    /**
     * 删除全部数据
     *
     * @param context
     */
    public static void deleteAllData(Context context) {
        DbManager.getDaoSession(context).getCbYfInfoBeanDao().deleteAll();
    }
    //===========================================update==================================================

    /**
     * 更新数据库
     *
     * @param context
     * @param bean
     */
    public static void updateData(Context context, CbYfInfoBean bean) {
        DbManager.getDaoSession(context).getCbYfInfoBeanDao().update(bean);
        int len = bean.getGRASS_WZ().size();
        for (int i = 0; i < len; i++) {
            CbYfWzInfoBean localIsExistBean = CbYfWzInfoBeanDaoOpe.queryEntityByParams(context, bean.getId(), bean.getGRASS_WZ().get(i).getWZMC());
            if (localIsExistBean != null) {
                bean.getGRASS_WZ().get(i).setId(localIsExistBean.getId());
                bean.getGRASS_WZ().get(i).setCbyfInfoId(localIsExistBean.getCbyfInfoId());
                CbYfWzInfoBeanDaoOpe.updateData(context, bean.getGRASS_WZ().get(i));
            } else {
                bean.getGRASS_WZ().get(i).setCbyfInfoId(bean.getId());
                CbYfWzInfoBeanDaoOpe.saveData(context,bean.getGRASS_WZ().get(i));
            }
        }
       // Log.i("TAG", "updateData: -------更新之前----------" + bean.toString() + "------" + len + "---更新之后---" + CbYfWzInfoBeanDaoOpe.queryAllForCbyfId(context, bean.getId()).toString());
    }
    //==========================================query==================================================

    /**
     * 查询当前样地下的所有草本样方
     *
     * @param context
     * @return
     */
    public static List<CbYfInfoBean> queryAllForUser(Context context, String sampleplotid) {
        DbManager.getDaoSession(context).clear();
        QueryBuilder<CbYfInfoBean> builder = DbManager.getDaoSession(context).getCbYfInfoBeanDao().queryBuilder();
        List<CbYfInfoBean> list = builder.where(CbYfInfoBeanDao.Properties.SAMPLEPLOTID.eq(sampleplotid)).list();
        for (CbYfInfoBean cbObj : list) {
            cbObj.getGRASS_WZ();
        }
        return list;
    }

    /*
    * 查询当前样地表下的单个草本样方
    * */
    public static CbYfInfoBean queryEntityForParams(Context context, String sampleplotid,  String grassid) {
        DbManager.getDaoSession(context).clear();//Greendao缓存的问题 ，再查之前清除缓存
        QueryBuilder<CbYfInfoBean> builder = DbManager.getDaoSession(context).getCbYfInfoBeanDao().queryBuilder();
        CbYfInfoBean bean = builder.where(CbYfInfoBeanDao.Properties.SAMPLEPLOTID.eq(sampleplotid), CbYfInfoBeanDao.Properties.GRASSID.eq(grassid)).unique();
        if (bean != null) {
            bean.getGRASS_WZ();
        }
        return bean;
    }
    //===============================================================================================
}
